只有累積,沒有奇蹟

2022年11月28日 星期一

[Benchmark] String 比較字串效能分析

前言
在 .NET 開發時很常會用到字串的比對,C# 中提供多種字串比對的方式,這篇文章就列出在 C# 提供的字串比方法,針對這幾種常用的方法使用  BenchmarkDotNet  做效能的測試及比對並會在 .NET Framework 與 .NET Core 分別測試結果,若有問題或是錯誤的地方歡迎各位給予指導及討論

測試代碼 
測試使用  BenchmarkDotNet  進行測試的動作,如果沒聽過此套件可以參考介紹的文章 [.NETCore] 使用 BenchmarkDotNet 測試程式碼效能,這次測試的項目是字串的比對方式效能差異,另外在 stringBenchmark 類別加上  ClrJob,CoreJob  希望分別在 .NET Framework 與 .NET Core 測試效能差異,代碼如下 
  1. namespace benchmarkLab
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. var summary = BenchmarkRunner.Run<stringCompareBenchmark>();
  8. Console.ReadKey();
  9. }
  10. }
  11.  
  12. [MemoryDiagnoser]
  13. [ClrJob,CoreJob]
  14. public class stringCompareBenchmark
  15. {
  16. public string string1 = "i am iron man";
  17. public string string2 = "I AM IRON MAN";
  18.  
  19. // 測試代碼
  20. }
  21. }
使用 Benchmark 測試數據,需要在方法上加上 Benchmark,使用 string 的比對測試的代碼如下
  1. [Benchmark]
  2. public void EqualityString()
  3. {
  4. if (string1 == string2) ;
  5. }
使用 string.Equals 的測試代碼如下
  1. [Benchmark]
  2. public void EqualString()
  3. {
  4. if (string1.Equals(string2)) ;
  5. }
使用 string.Compare 比對 string 的方式如下
  1. [Benchmark]
  2. public void CompareString()
  3. {
  4. if (string.Compare(string1, string2) == 0) ;
  5. }
使用 string.CompareOrdinal,測試的代碼如下
  1. [Benchmark]
  2. public void CompareOrdinalString()
  3. {
  4. if (string.CompareOrdinal(string1, string2) == 0) ;
  5. }
使用 string.compareTo,測試的代碼如下
  1. [Benchmark]
  2. public void CompareToString()
  3. {
  4. if (string1.CompareTo(string2) == 0) ;
  5. }
使用 string.Concat,測試的代碼如下
  1. [Benchmark]
  2. public void Concat()
  3. {
  4. string s = string.Empty;
  5. s = string.Concat(firstWord, secondWord);
  6. }
也可以使用 indexOf 方法找,因此也一併列出看看測試效能測試的代碼如下
  1. [Benchmark]
  2. public void IndexOfString()
  3. {
  4. if (string1.IndexOf(string2) == 0) ;
  5. }
接著調整到 Release mode,按下 F5 進行測試
測試完成後,會產生測試報各路徑在  release\BenchmarkDotNet.Artifacts\results  目錄底下,如下圖所示
根據測試結果
  • .NET Framework : 表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal
  • .NET Core : 同樣表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal

  • 感想
    透過結果得知,在 .NET Framework 與 .NET Core 環境中在字串比較上,效能最好的是 string.CompareOrdinal,== 與 string.Equals 緊追在後,IndexOf 則是在 .NET Framework 與 .NET Core 都墊底,另外在微軟 MSDN 在 .NET 中比較字串 文章中也有介紹常見的字串比對,有特別強調 CompareOrdinal 主要是用於排序或字串排序時。 不應該使用 String.CompareOrdinal 方法來測試是否相等
    得到最後的結論 compareOrdinal 雖然快,但 若要判斷兩個字串是否相等,請使用 String.Equals ,另外文章列出的 String.StartsWith、String.EndsWith 在本次比較中並未列出,原因是個人覺得在情境上與其他出發點不同,若是想了解更多各位客官也可自行測試看看,以上就是比較字串的結果,Happy Coding :)

    Related Posts:

    • [Benchmark] String 比較字串效能分析前言 在 .NET 開發時很常會用到字串的比對,C# 中提供多種字串比對的方式,這篇文章就列出在 C# 提供的字串比方法,針對這幾種常用的方法使用  BenchmarkDotNet  做效能的測試及比對,並會在 .NET Framework 與 .NET Core 分別測試結果,若有問題或是錯誤的地方歡迎各位給予指導及討論。 測試代碼  測試使用  BenchmarkDotNe… Read More
    • [NETCore] 動態 String 字串相加效能比較 前言 在前一篇 [.NETCore] String 字串相加效能比較 對於 C# string 的應用做了一些測試,得到在使用固定字串相加時使用 string 效能反而比 stringBuilder 來的好,在 string  有多種應用情境因此這篇就在針對另一種使用情境針對 string 動態文字相加做比較若有問題或是錯誤的地方歡迎各位給予指導及討論。 測試代碼  測試方式同樣以  B… Read More
    • [NETCore] String 字串相加效能比較 前言 在 .NET 應用程式中很常使用到 string 型別,string 是不可變 ( Immutable ) 的,當每次建立完就會固定其長度,如果要做相加就必須捨棄原有使用的記憶體,在重新配置一塊新的記憶體給它使用,如果在需要大量得字串動態相加時就會影響到其效能,因此在動態文字相加情境就可以透過 stringBuilder 來改善此問題,詳細細節可以參考黑暗大的 StringBuilder串接字串的迷思,這篇重點是在 C# 有提供多… Read More
    • [NETCore] 使用 BenchmarkDotNet 測試程式碼效能前言 在開發或是 POC 時為了記錄代碼程式執行的時間,都會採用在代碼上加上  stopWatch  紀錄花費時間,使用方式不外乎就是 new Stopwatch、Start、Stop、Reset、ElapsedMilliseconds,以詳細記錄代碼所花費的時間,接下來為了要顯示在 console 上可能還要針對 log 在輸出內容做簡單排版方便記錄,最近發現上述惱人的事情都可以使用  Benc… Read More

    0 意見:

    張貼留言

    Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com